namespace Digitalmes.Application.Sys.Menus;

/// <summary>
/// 菜单 DTO 对象。
/// </summary>
public sealed class SysMenuDto : Dto
{
    /// <summary>
    /// 父 Id，顶级菜单时为 0。
    /// </summary>
    public long ParentId { get; set; }

    /// <summary>
    /// 菜单类型（0->目录、1->菜单、2->按钮）
    /// </summary>
    public int Type { get; set; }

    /// <summary>
    /// 菜单名称。
    /// </summary>
    /// <remarks>
    /// 用于按钮时，显示 新增、编辑、删除、查看、导出 等。
    /// </remarks>
    [NotNull]
    public string? Title { get; set; }

    /// <summary>
    /// 路由唯一名称，按钮无需设置
    /// </summary>
    public string? Name { get; set; }

    /// <summary>
    /// 路由地址
    /// </summary>
    public string? Path { get; set; }

    /// <summary>
    /// 组件路径
    /// </summary>
    public string? Component { get; set; }

    /// <summary>
    /// 图标
    /// </summary>
    public string? Icon { get; set; }

    /// <summary>
    /// iframe 地址
    /// </summary>
    public string? IframeSrc { get; set; }

    /// <summary>
    /// 外链-跳转路径
    /// </summary>
    public string? Link { get; set; }

    /// <summary>
    /// 配置页面是否固定标签页，固定后页面不可关闭
    /// </summary>
    public bool AffixTab { get; set; }

    /// <summary>
    /// 开启KeepAlive缓存
    /// </summary>
    public bool KeepAlive { get; set; }

    /// <summary>
    /// 当前路由在菜单中不展现
    /// </summary>
    public bool HideInMenu { get; set; }

    /// <summary>
    /// 当前路由的子级在菜单中不展现
    /// </summary>
    public bool HideChildrenInMenu { get; set; }

    /// <summary>
    /// 当前路由在标签页不展现
    /// </summary>
    public bool HideInTab { get; set; }

    /// <summary>
    /// 在新窗口打开
    /// </summary>
    public bool OpenInNewWindow { get; set; }

    /// <summary>
    /// 需要特定的角色标识才可以访问
    /// </summary>
    public string[]? Authority { get; set; }

    /// <summary>
    /// 权限标识。
    /// </summary>
    /// <remarks>
    /// 权限标识主要用于菜单页面上的按钮，不同角色可分配不同的按钮权限。
    /// 一般规范写法为 xxx:btn:add、xxx:btn:edit、xxx:btn:delete 等，其中 xxx 为页面名称。
    /// </remarks>
    public string? Permission { get; set; }

    /// <summary>
    /// 排序
    /// </summary>
    public int Order { get; set; }

    /// <summary>
    /// 状态
    /// </summary>
    public EnabledStatusEnum Status { get; set; }

    public string? CreatedBy { get; set; }

    public DateTime CreatedTime { get; set; }

    public string? UpdatedBy { get; set; }

    public DateTime? UpdatedTime { get; set; }

    /// <summary>
    /// 子菜单
    /// </summary>
    public List<SysMenuDto>? Children { get; set; }
}
